var FS = require("fs");

var 图像结构 = require("./utils/image-to-struct.js");

var jsmin = require("./utils/js-min.js");

var 保持线 = require("./utils/keep-line.js");

var 承诺 = require("bluebird");

var JS2图像 = function(JS代码, 图像路径, 选项, 回调) {
    图像结构(图像路径, 选项).then(function(结构) {
        jsmin(JS代码).then(function(代码) {
            var 保持代码 = 保持线.pickFromCode(代码);
            var 线 = 保持代码.replace(/([^a-zA-Z_0-9=!|&$])/g, "\n$1\n").split("\n");
            保持线.findBack(线);
            var 结果 = "";
            while (线.length > 0) {
                结构.forEach(function(S) {
                    var 字符数组 = S.replace(/ +/g, " ");
                    var R = S;
                    字符数组.split(/ +/).forEach(function(字符) {
                        if (字符.length == 0) {
                            return;
                        }
                        var 字符计数 = 字符.length;
                        var l = pickFromLines(线, 字符计数);
                        R = R.replace(字符, function() {
                            return l;
                        });
                    });
                    结果 += R + "\n";
                });
            }
            回调(null, 结果);
        }).catch(function(E) {
            回调(E);
        });
    });
};

module.exports = {
    writeToFile: function(js的路径, 图像路径, 输出路径, 选项) {
        var JS代码 = FS.readFileSync(js的路径);
        return new 承诺(function(决定, 拒绝) {
            JS2图像(JS代码.toString(), 图像路径, 选项, function(E, 代码) {
                代码 = "/* generated by https://github.com/xinyu198736/js2image */ \n\n" + 代码;
                FS.writeFileSync(输出路径, 代码, "utf-8");
                if (E) {
                    拒绝(E);
                } else {
                    决定(代码);
                }
            });
        });
    },
    getCode: function(JS代码, 图像路径, 选项) {
        return new 承诺(function(决定, 拒绝) {
            JS2图像(JS代码, 图像路径, 选项, function(E, 代码) {
                if (E) {
                    拒绝(E);
                } else {
                    决定(代码);
                }
            });
        });
    }
};

function pickFromLines(线, 计数) {
    var T = "";
    var 已接数 = 0;
    var 现在的长度 = 0;
    for (var 我 = 0; 我 < 线.length; 我++) {
        var l = 线[我];
        现在的长度 += l.length;
        已接数++;
        if (现在的长度 > 计数) {
            if (现在的长度 - 计数 > 3 && 已接数 > 1) {
                已接数--;
            }
            break;
        }
    }
    for (var 我 = 0; 我 < 已接数; 我++) {
        var S = 线.shift();
        T += S;
    }
    return T;
}